﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GmFamilyService.h"
#include "IParameterDefinition.h"
#include "IParameterValueList.h"
#include "UniIdentity.h"
#include "IFamilyEntity.h"

namespace gcmp
{
    enum class ParameterStorageType;
}

namespace gfam
{
    enum class FamilyParameterType;
    
    /// \brief 族参数定义类
    /// 
    FINAL_INTERFACE class GM_FAMILY_SERVICE_EXPORT IFamilyParameterDefinition : public IFamilyEntity
    {
        DEFINE_CAST_DERIVED(gfam::IFamilyParameterDefinition, gfam::IFamilyEntity)
    public:

        /// \brief 创建族参数定义。
        ///
        /// \param pDocument 文档类
        /// \param name 名称
        /// \param familyParameterType 类型
        /// \return 返回创建的族参数定义
        static IFamilyParameterDefinition* Create(gcmp::IDocument* pDocument, const std::wstring& name, FamilyParameterType familyParameterType);

        /// \brief 创建族参数定义。
        ///
        /// \param pDocument 文档类
        /// \param name 名称
        /// \param familyParameterType 类型
        /// \param isInstance 是否实例参数
        /// \param formula 公式
        /// \return 返回创建的族参数定义
        static IFamilyParameterDefinition* Create(gcmp::IDocument* pDocument, const std::wstring& name, FamilyParameterType familyParameterType, bool isInstance, const std::wstring& formula);

        /// \brief 根据已有的族参数定义创建一个新的族参数定义。
        ///
        /// \param pDocument 文档类
        /// \param pFamilyParameterDefinition 源族参数定义
        /// \return 返回创建的族参数定义
        static IFamilyParameterDefinition* Create(gcmp::IDocument* pDocument, const IFamilyParameterDefinition* pFamilyParameterDefinition);

        /// \brief 根据参数定义创建族参数定义
        ///
        /// \param pDocument 文档类
        /// \param parameterDefinition 源参数定义
        /// \return 返回创建的族参数定义
        static IFamilyParameterDefinition* Create(gcmp::IDocument* pDocument, const gcmp::IParameterDefinition* parameterDefinition);

        /// \brief 创建族参数定义。
        ///
        /// \param pDocument 文档类
        /// \param parameterDefinition 源参数定义
        /// \param familyParameterType 类型
        /// \param isInstance 是否实例参数
        /// \param formula 公式
        /// \return 返回创建的族参数定义
        static IFamilyParameterDefinition* Create(gcmp::IDocument* pDocument, const gcmp::IParameterDefinition* parameterDefinition, FamilyParameterType familyParameterType, bool isInstance, const std::wstring& formula);


        /// \brief 根据BIM标准创建族参数定义。
        ///
        /// \param pDocument 文档类
        /// \param attributeCode BIM标准编码
        /// \return 返回创建的族参数定义
        static IFamilyParameterDefinition* Create(gcmp::IDocument* pDocument, std::wstring attributeCode);

    public:

        /// \brief 获取族参数定义的uid
        ///
        /// \return 族参数定义的uid
        virtual gcmp::UniIdentity GetUid() const = 0;

        /// \brief 设置族参数定义的uid
        ///
        /// \param uid 族参数定义的跨文档Id
        virtual void SetUid(const gcmp::UniIdentity& uid) = 0;

        /// \brief 获取族参数定义的类型
        ///
        /// \return 族参数定义的类型
        virtual FamilyParameterType GetParameterType() const = 0;

        /// \brief 设置族参数定义的类型
        ///
        /// \param familyParameterType 族参数类型
        virtual void SetParameterType(FamilyParameterType familyParameterType) = 0;

        /// \brief 是否公式驱动参数值
        ///
        /// \return true 公式决定参数值，false 公式不影响参数值
        virtual bool IsDeterminedByFormula() const = 0;

        /// \brief 获取公式
        /// 
        /// \return 公式
        virtual std::wstring GetFormula() const = 0;

        /// \brief 设置公式
        ///
        /// \param formula 公式
        virtual void SetFormula(const std::wstring& formula) = 0;

        /// \brief 获取是否是实例参数
        /// 
        /// \return true 实例参数，false 类型参数
        virtual bool IsInstance() const = 0;

        /// \brief 设置是否为实例参数
        ///
        /// \param isInstance true为实例参数，false为类型参数
        virtual void SetInstance(bool isInstance) = 0;

        /// \brief 获取是否是共享参数
        virtual bool IsShared() const = 0;

        /// \brief 设置是共享
        ///
        /// \param shared 是否共享
        virtual void SetShared(bool shared) = 0;

        /// \brief 获取是否可编辑
        ///
        /// \return true可编辑, false 不可编辑
        virtual bool IsEditable() const = 0;

        /// \brief 设置是否可编辑
        ///
        /// \param editable 是否可编辑
        virtual void SetEditable(bool editable) = 0;

        /// \brief 判断是否由标准属性创建的族参数定义。
        ///
        /// \return 如果是由标准属性创建的族参数定义，则返回true；否则返回false。
        virtual bool IsStandard() const = 0;

        /// \brief 获取标准属性编码
        ///
        /// \return 标准属性编码
        virtual std::wstring GetStandardCode() const = 0;

        // 设置标准编码。如果是由标准编码创建的参数定义，需要将标准编码设置给参数定义对象。
        virtual bool SetStandardCode(const std::wstring& code) = 0;

        /// \brief 获取参数标准类型
        ///
        /// \return 参数标准类型
        virtual gcmp::ParameterStandardType GetStandardType() const = 0;
        
        /// \brief 设置参数标准类型
        ///
        /// \param parameterStandardType 参数标准类型
        virtual void SetStandardType(gcmp::ParameterStandardType parameterStandardType) = 0;
        
        /// \brief 获取值列表
        ///
        /// \return 值列表
        virtual const gcmp::IParameterValueList* GetValueList() const = 0;

        /// \brief 设置值列表
        ///
        /// \param valueList 值列表
        virtual void SetValueList(gcmp::OwnerPtr<gcmp::IParameterValueList> valueList) = 0;

        /// \brief 获取族参数定义名字
        ///
        /// \return 族参数定义名字
        virtual const std::wstring& GetName() const = 0;

        /// \brief 设置族参数定义名字
        /// 
        /// \param name 族参数定义名字
        virtual void SetName(const std::wstring& name) = 0;

        /// \brief 获取族参数定义分组的名字
        ///
        /// \return 族参数定义分组名字
        virtual std::wstring GetGroupName() const = 0;

        /// \brief 设置族参数定义分组的名字
        ///
        /// \param groupName 族参数定义分组名字
        virtual void SetGroupName(const std::wstring& groupName) = 0;

        /// \brief 获取族参数定义描述信息
        /// 
        /// \return 族参数定义描述信息
        virtual std::wstring GetDescription() const = 0;

        /// \brief 设置族参数定义描述信息
        /// 
        /// \param description 描述信息
        virtual void SetDescription(const std::wstring& description) = 0;

        /// \brief 获取族参数定义存储类型
        ///
        /// \return 族参数定义存储类型
        virtual gcmp::ParameterStorageType GetStorageType() const = 0;

        /// \brief 获取参数定义单位类型
        ///
        /// \return 参数定义单位类型
        virtual gcmp::UniIdentity GetUnitTypeId() const = 0;

        /// \brief 设置参数定义单位类型
        ///
        /// \param unitTypeId 单位类型
        virtual void SetUnitTypeId(const gcmp::UniIdentity& unitTypeId) = 0;

        /// \brief 获取参数定义参数类型
        ///
        /// \return 参数类型
        virtual gcmp::UniIdentity GetParameterTypeId() const = 0;

        /// \brief 设置参数定义参数类型
        ///
        /// \param paramTypeId 参数类型
        virtual void SetParameterTypeId(const gcmp::UniIdentity& paramTypeId) = 0;

        /// \brief 返回族参数在族参数面板中是否可见（族环境下）
        /// \return 在族参数面板中可见返回true，否则false
        virtual bool IsVisible() const = 0;

        /// \brief 设置族参数是否在族参数面板中可见（族环境下）
        /// \param isVisible true 在族参数面板中可见，false 在族参数面板中不可见
        virtual void SetVisible(bool isVisible) = 0;

        ///// \brief 返回族参数是否可用户修改
        ///// \return 可修改返回true，否则false
        //virtual bool IsUserModifiable() const = 0;

        ///// \brief 设置族参数是否是用户可编辑
        ///// \param visible true 用户可编辑，false 用户不可编辑
        //virtual void SetUserModifiable(bool modifiable) = 0;

        ///// \brief 返回族参数是否是用户可见
        ///// \return 如果是用户可见，返回true，否则false
        //virtual bool IsUserVisible() const = 0;

        ///// \brief 设置族参数是否是用户可见
        ///// \param visible true 用户可见，false 用户不可见
        //virtual void SetUserVisible(bool visible) = 0;

        /// \brief 根据已有族参数定义拷贝值
        ///
        /// \param pFamilyParameterDefinition 源族参数定义
        /// 
        virtual void Copy(const IFamilyParameterDefinition* pFamilyParameterDefinition) = 0;

    public:

        /// \brief 获得元素基础信息模块
        /// \return IBasicInformation* 基础信息模块指针
        virtual const gcmp::IElementBasicInformation* GetBasicInformation() const = 0;

        /// \brief 获得元素的Id
        /// \return ElementId 元素的Id
        virtual gcmp::ElementId GetElementId() const = 0;

    };

} // end namespace gfam
